{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.datasets import load_digits\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.metrics import mean_squared_error\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Домашнее задание \"Продвинутая линейная алгебра\"\n",
    "\n",
    "## Уровень 0:\n",
    "\n",
    "Придумайте матрицы, которые обладают следующими свойствами:\n",
    "\n",
    "a) Диагональная, ортогональная, но не единичная(!)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1,  0,  0],\n",
       "       [ 0, -1,  0],\n",
       "       [ 0,  0, -1]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.array([[-1,0,0],[0,-1,0],[0,0,-1]])\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [0, 1, 0],\n",
       "       [0, 0, 1]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m@m.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b) Верхнетреугольная, ортогональная"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  0,  0],\n",
       "       [ 0, -1,  0],\n",
       "       [ 0,  0, -1]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.array([[1,0,0],[0,-1,0],[0,0,-1]])\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [0, 1, 0],\n",
       "       [0, 0, 1]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m@m.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c) Нижнетреугольная, ортогональная"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  0,  0],\n",
       "       [ 0, -1,  0],\n",
       "       [ 0,  0,  1]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.array([[1,0,0],[0,-1,0],[0,0,1]])\n",
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [0, 1, 0],\n",
       "       [0, 0, 1]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m@m.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "d) Матрица, у которой определитель = 1, и все элементы не равны 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m = np.array([[5,  0.9],\n",
    "              [10, 2  ]])\n",
    "np.linalg.det(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Найдите собственные значения и собственные вектора матриц:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2 2]\n",
      " [1 3]]\n"
     ]
    }
   ],
   "source": [
    "m = np.array([[2, 2],\n",
    "              [1, 3]])\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Собственное число - 1.0, соответствующий собственный вектор - [-0.89442719 -0.70710678]\n",
      "Собственное число - 4.0, соответствующий собственный вектор - [ 0.4472136  -0.70710678]\n"
     ]
    }
   ],
   "source": [
    "w, v = np.linalg.eig(m)\n",
    "for index in range(len(w)):\n",
    "    print(f'Собственное число - {w[index]}, соответствующий собственный вектор - {v[index]}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Уровень 1:\n",
    "Найдите спектральное разложение матрицы:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 2]\n",
      " [2 3]]\n"
     ]
    }
   ],
   "source": [
    "m = np.array([[1, 2],\n",
    "              [2,3]])\n",
    "print(m)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "w, v = np.linalg.eig(m)\n",
    "matrix_D = np.diag(w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 2.],\n",
       "       [2., 3.]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# По формуле спектрального разложения найдем исходную матрицу, должна совпасть с заданной\n",
    "v @ matrix_D @ v.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Постройте зависимость качества восстановления рукописных цифр (MNIST) в зависимости от различного количества компонент PCA. В качестве метрики различия предлагаю использовать MSE."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = load_digits(return_X_y=True)\n",
    "digit = X[2]\n",
    "digit = digit.reshape((8, 8))\n",
    "plt.matshow(digit, cmap = 'gray')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Качество модели будем оценивать следующими способами:\n",
    "\n",
    "- Чем больше исходных данных, которые могут описать наши главные компоненты, тем модель лучше. \n",
    "\n",
    "В данном случае собственные числа в матричном разложении - максимальный размер дисперсии на определенном пространственном уровне. За 100% берем сумму всех максимальных дисперсий в каждом измерении исходных данных. При выборе количества главных компонент меньше уровня изначальных измерений, мы отбрасываем уровни с наименьшей дисперисей. В результате наши главные компоненты будут описывать модель уже не на 100%, а меньше. Считается оптимальным выбором, если главные компоненты содержат в себе 95-99% всей дисперсии из исходных данных.\n",
    "\n",
    "- Оптимальная модель не должна включать в себя собственные значения (дисперсии) меньше 1. Условие не жесткое, зависит от ситуации.\n",
    "\n",
    "- Невысокий уровень MSE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество факторов: 1\n",
      "MSE 6.1\n",
      "Процент исходной информации в главных компонентах: 61.96%\n",
      "Дисперсия наименьшего главного компонента: 90.82\n",
      "===============================================\n",
      "Количество факторов: 2\n",
      "MSE 3.53\n",
      "Процент исходной информации в главных компонентах: 77.97%\n",
      "Дисперсия наименьшего главного компонента: 23.47\n",
      "===============================================\n",
      "Количество факторов: 3\n",
      "MSE 1.53\n",
      "Процент исходной информации в главных компонентах: 90.44%\n",
      "Дисперсия наименьшего главного компонента: 18.28\n",
      "===============================================\n",
      "Количество факторов: 4\n",
      "MSE 0.4\n",
      "Процент исходной информации в главных компонентах: 97.52%\n",
      "Дисперсия наименьшего главного компонента: 10.38\n",
      "===============================================\n",
      "Количество факторов: 5\n",
      "MSE 0.15\n",
      "Процент исходной информации в главных компонентах: 99.07%\n",
      "Дисперсия наименьшего главного компонента: 2.27\n",
      "===============================================\n",
      "Количество факторов: 6\n",
      "MSE 0.0\n",
      "Процент исходной информации в главных компонентах: 100.0%\n",
      "Дисперсия наименьшего главного компонента: 1.36\n",
      "===============================================\n",
      "Количество факторов: 7\n",
      "MSE 0.0\n",
      "Процент исходной информации в главных компонентах: 100.0%\n",
      "Дисперсия наименьшего главного компонента: 0.0\n",
      "===============================================\n",
      "Количество факторов: 8\n",
      "MSE 0.0\n",
      "Процент исходной информации в главных компонентах: 100.0%\n",
      "Дисперсия наименьшего главного компонента: 0.0\n",
      "===============================================\n"
     ]
    }
   ],
   "source": [
    "mse_stat = []\n",
    "orig_inf_percent_stat = []\n",
    "for number_factors in range(1, 9):\n",
    "    pca = PCA(n_components=number_factors)\n",
    "    pca_digit = pca.fit_transform(digit)\n",
    "    pca_digit_recover = pca.inverse_transform(pca_digit)\n",
    "    mse = round(mean_squared_error(pca_digit_recover, digit), 2)\n",
    "    \n",
    "    # Общий процент исходной информации, которые могут описать наши главные компоненты\n",
    "    orig_inf_percent = round(sum(pca.explained_variance_ratio_)*100, 2)\n",
    "    # Минимальное значение дисперсии главных компонент\n",
    "    minimal_var = round(pca.explained_variance_[-1], 2)\n",
    "    \n",
    "    mse_stat.append((number_factors, mse))\n",
    "    orig_inf_percent_stat.append((number_factors, orig_inf_percent))\n",
    "    \n",
    "    print(f'Количество факторов: {number_factors}')\n",
    "    print(f'MSE {mse}')\n",
    "    print(f'Процент исходной информации в главных компонентах: {orig_inf_percent}%')\n",
    "    print(f'Дисперсия наименьшего главного компонента: {minimal_var}')\n",
    "    print(f'===============================================')\n",
    "    \n",
    "mse_stat = np.array(mse_stat)\n",
    "orig_inf_percent_stat = np.array(orig_inf_percent_stat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(mse_stat[:,0], mse_stat[:,1])\n",
    "plt.xlabel(\"Количество главных компонент\")\n",
    "plt.ylabel(\"MSE\")\n",
    "plt.title('Зависимость MSE от количества главных компонент')\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(orig_inf_percent_stat[:,0], orig_inf_percent_stat[:,1])\n",
    "plt.xlabel(\"Количество главных компонент\")\n",
    "plt.ylabel(\"% исходной информации\")\n",
    "plt.title('Зависимость кол-ва исходной информации в главных компонентах от их количества')\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Из полученных результатов можно сделать вывод:\n",
    "- для 100% восстановления изображения нам необходимо не более 6 главных компонент, 2 из 8 измерения имеют нулевую дисперсию и вообще не важны для восстановления данных, также MSE = 0\n",
    "- оптимальное количество главных компонент - 4, четыре компоненты могут описать исходные данные с точностью 97%. MSE < 1.\n",
    "- один фактор может описать исходные данные на 61%, что не является достаточным."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
